package br.com.condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.condominio.beans.Funcionario;
import br.com.condominio.beans.Residencia;
import br.com.condominio.conexao.Conexao;

public class FuncionarioDAO {

	private Conexao conexao;

	public void criar(Funcionario funcionario) throws SQLException {
		Connection con = conexao.getConnection();
		PreparedStatement ps;

		String sqlInsert = "INSERT INTO funcionario ( cod_residencia, nome, rg, telefone, "
				+ " sexo, idade, horario_entrada, horario_saida) "
				+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?);";
		try {
			ps = con.prepareStatement(sqlInsert);

			setPreparedStatement(funcionario, ps);

			ps.executeUpdate();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
	}

	public void atualizar(Funcionario funcionario) throws SQLException {
		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlAtualizar = "UPDATE funcionario SET cod_residencia = ?, nome = ?, rg = ?, "
					+ "telefone = ?, sexo = ?, idade = ?, horario_entrada = ?, horario_saida = ?;";

			ps = con.prepareStatement(sqlAtualizar);
			setPreparedStatement(funcionario, ps);

			ps.executeUpdate();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
	}

	public Funcionario getFuncionarioByID(Integer id) throws SQLException {
		Funcionario funcionario = null;
		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlSelect = "SELECT * FROM funcionario WHERE cod_funcionario = ? ;";
			ps = con.prepareStatement(sqlSelect);
			ps.setInt(1, id);
			ResultSet rs = ps.executeQuery();

			List<Funcionario> resultado = getListaFuncionarios(rs);
			if (resultado.size() > 0)
				funcionario = resultado.get(0);

			rs.close();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
		return funcionario;
	}

	public void excluir(Integer codigo) throws SQLException {
		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlDelete = "DELETE FROM funcionario WHERE cod_funcionario = ? ;";
			ps = con.prepareStatement(sqlDelete);
			ps.setInt(1, codigo);
			ps.executeUpdate();

			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
	}

	public List<Funcionario> getAllFuncionarios() throws SQLException {

		List<Funcionario> resultado = null;

		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlSelect = "SELECT * FROM funcionario;";

			ps = con.prepareStatement(sqlSelect);
			ResultSet rs = ps.executeQuery();

			resultado = getListaFuncionarios(rs);

			rs.close();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
		return resultado;
	}

	private List<Funcionario> getListaFuncionarios(ResultSet rs)
			throws SQLException {
		List<Funcionario> resultado = new ArrayList<Funcionario>();
		while (rs.next()) {
			Funcionario funcionario = new Funcionario();
			funcionario.setCodResidencia((rs.getInt("cod_residencia")));
			funcionario.setHorarioEntrada(rs.getDate("horario_entrada"));
			funcionario.setHorarioSaida(rs.getDate("horario_saida"));
			funcionario.setIdade(rs.getInt("idade"));
			funcionario.setNome(rs.getString("nome"));
			funcionario.setRg(rs.getString("rg"));
			funcionario.setSexo(rs.getString("sexo"));
			funcionario.setTelefone(rs.getString("telefone"));

			//TODO: Ver se nao vai der erro aki, por nao ser estatico...
			Residencia residencia = new ResidenciaDAO().getResidenciaByID(rs
					.getInt("cod_residencia"));
			funcionario.setResidencia(residencia);

			resultado.add(funcionario);
		}
		return resultado;
	}

	private void setPreparedStatement(Funcionario funcionario,
			PreparedStatement ps) throws SQLException {
		ps.setInt(1, funcionario.getCodResidencia());
		ps.setString(2, funcionario.getNome());
		ps.setString(3, funcionario.getRg());
		ps.setString(4, funcionario.getTelefone());
		ps.setString(5, funcionario.getSexo());
		ps.setInt(6, funcionario.getIdade());
		ps.setDate(7, funcionario.getHorarioEntrada());
		ps.setDate(8, funcionario.getHorarioSaida());
	}
}
